package leetcode.templates.trees.segment;

// @see Solution_STNODE
public class Node {
	private int L, M, R;

	private Node Left, Right;

//	public int max;
	
	boolean update;

	public Node(int l, int r) {
		L = l;
		R = r;
		M = ((r - l) >> 1) + l;
		//
//		max = Integer.MIN_VALUE;
	}

	public int query(int l, int r) {
		if (l == L && r == R) {
			// TODO
//			return max;
			return 0;
		} else {
			int ans = Integer.MIN_VALUE;
			if (l <= M) {
				ans = left().query(l, Math.min(r, M));
			}
			if (M < r) {
				ans = Math.max(ans, right().query(Math.max(l, M + 1), r));
			}
			return ans;
		}
	}
	
	public void update(int l, int r) {
		if (l == L && r == R) {
//			reverse();
		} else {
			if (update) {
//				left().reverse();
//				right().reverse();
				update = !update;
			}
			if (l <= M) {
				left().update(l, Math.min(r, M));
			}
			if (M < r) {
				right().update(Math.max(l, M + 1), r);
			}
//			cnt1 = left().cnt1 + right().cnt1;
		}
	}

	public void init(int x, int v) {
		if (L == R) {
//			max = v;
		} else {
			if (x <= M) {
				left().init(x, v);
			} else {
				right().init(x, v);
			}
//			max = Math.max(left().max, right().max);
		}
	}

	private Node left() {
		if (Left == null) {
			Left = new Node(L, M);
		}
		return Left;
	}

	private Node right() {
		if (Right == null) {
			Right = new Node(M + 1, R);
		}
		return Right;
	}

}
